﻿using System;
using System.Collections.Generic;
using System.Collections.Concurrent;
using System.Linq;
using System.Text;

namespace CTP.Session
{
    /// <summary>
    /// 功能：会话管理，一切由客户系统发出的请求会话都由SessionManager管理。
    ///       当接收到客户系统的请求的时候，SessionManager根据客户系统请求参数中的资金账号获取可用
    ///       的会话，由该会话完成客户请求。
    /// 创建：陈粤雄 20120428
    /// </summary>
    internal class SessionManager
    {
        #region 字段
        /// <summary>
        /// SessionManager的实例
        /// </summary>
        private static SessionManager m_Instance;

        /// <summary>
        /// 当前已建立的会话的列表
        /// </summary>
        private ConcurrentDictionary<string, Session> m_AllSessions = new ConcurrentDictionary<string, Session>();

        #endregion

        #region 属性
        /// <summary>
        /// 获取SessionManager的实例
        /// </summary>
        public static SessionManager Instance { get { return m_Instance; } }
        #endregion

        #region 构造
        /// <summary>
        /// 静态构造函数，在这里初始化静态成员
        /// </summary>
        static SessionManager()
        {
            m_Instance = new SessionManager();
        }

        /// <summary>
        /// 私有构造函数，保证只有一个实例
        /// </summary>
        private SessionManager()
        {
        }
        #endregion

        #region 公开方法
        /// <summary>
        /// 获取一个Session，如果不存在指定资金账号的Session，则先创建一个新的Session
        /// </summary>
        /// <param name="tradingAccount"></param>
        /// <returns></returns>
        public Session GetSession(string tradingAccount)
        {
            if (string.IsNullOrEmpty(tradingAccount))
                return null;

            Session session;
            if (m_AllSessions.TryGetValue(tradingAccount, out session))
            {
                return session;
            }

            return null;
        }

        /// <summary>
        /// 添加一个会话
        /// </summary>
        /// <param name="tradingAccount"></param>
        /// <param name="session"></param>
        public void Add(string tradingAccount,Session session)
        {
            if (string.IsNullOrEmpty(tradingAccount) || session == null)
                return;

            if(m_AllSessions.ContainsKey(tradingAccount))
                return;

            m_AllSessions.TryAdd(tradingAccount, session);
        }
        #endregion
    }
}
